package com.yh.service.impl;

import com.yh.mapper.UserMapper;
import com.yh.model.Role;
import com.yh.model.UserInfo;
import com.yh.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.security.SecurityProperties;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    UserMapper userMapper;

    /**
     * 查询所有用户
     *
     * @return
     */
    @Override
    public List<UserInfo> findAll() {
        return userMapper.findAll();
    }

    /**
     * 新增用户
     *
     * @param userInfo
     */
    @Override
    public void save(UserInfo userInfo) {
        //明文密码 进行加密
        String pwd = new BCryptPasswordEncoder().encode(userInfo.getPassword());
        userInfo.setPassword(pwd);
        userMapper.save(userInfo);
    }

    /**
     * 根据用户id查询用户详情(用户 角色 权限,两个关系表)
     *
     * @param id 用户id
     * @return 用户详情
     */
    @Override
    public UserInfo findById(Integer id) {
        return userMapper.findById(id);
    }

    /**
     * 根据用户id查询用户没有的角色集合(可添加的角色集合)
     *
     * @param id 用户id
     * @return 用户没有的角色集合
     */
    @Override
    public List<Role> findUserByIdAndAllRole(Integer id) {
        return userMapper.findUserByIdAndAllRole(id);
    }

    /**
     * 为用户分配角色(往关系表中添加数据)
     *
     * @param userId
     * @param ids
     */
    @Override
    public void addRoleToUser(Integer userId, Integer[] ids) {
        for (Integer rid : ids) {
            userMapper.addRoleToUser(userId, rid);
        }
    }

    /**
     * 删除指定的用户信息(并且删除关系表中的关联数据)
     *
     * @param id 用户id
     */
    @Override
    public void deleteUser(Integer id) {
        //删除用户对应的关联关系
        userMapper.deleteUserAndRoleRelation(id);
        //删除用户信息
        userMapper.deleteUserById(id);
    }


    //认证和授权
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        // 根据账号查找用户的详细信息( 用户信息  和 角色集合 )
        UserInfo userInfo = userMapper.loadUserByUsername(username);
        if (userInfo != null) {
            User user = new User(username, //账号
                    userInfo.getPassword(), //密码
                    userInfo.getStatus()==1 ? true : false, //账号是否可用
                    true, //账号是否未过期
                    true, //凭证是否未过期
                    true, //账号是否被锁定
                    getAuthorities(userInfo.getRoles()));
            return user;
        }
        return null;
    }


    /**
     * 根据用户的角色集合 获取 权限集合
     * @param roles
     * @return
     */
    private Set<SimpleGrantedAuthority> getAuthorities(List<Role> roles){ //[ADMIN,USER]
        Set<SimpleGrantedAuthority> authorities = new HashSet<>();
        for (Role role : roles) {
            authorities.add(new SimpleGrantedAuthority("ROLE_"+role.getRoleName()));// ROLE_ADMIN   ROLE_USER
        }
        return authorities;
    }
}
